import axios from "axios";
import qs from "qs";
import Vue from "vue";
import { Message } from "element-ui";

// 创建实例时设置配置的默认值
const instance = axios.create({
    baseURL: process.env.VUE_APP_API_URL,
    timeout: process.env.VUE_APP_AJAX_TIMEOUT,
});

// 让实例支持流操作
instance.all = axios.all;

// 全局拦截请求头
instance.interceptors.request.use(
    (config) => {
        // 如果没有主动设置认证头, 那么就从H5存储中读取, 适用于一些Native套H5页面的方案
        if (!config.headers["Authorization"]) {
            const tokenName = process.env.VUE_APP_TOKEN_KEY;
            const token = window.sessionStorage.getItem(tokenName) || window.localStorage.getItem(tokenName);
            if (token) config.headers.Authorization = `Bearer ${token}`;
        }
        // 如果请求方式是post
        if (config.method == "post") {
            if (config.headers["Content-Type"] == "multipart/form-data") {
                // 如果是上传文件, 那么将全局10秒超时机制取消
                config.timeout = 0;
            } else {
                // 否则对参数进行转换发送, 不转换常规后端接收不到
                config.data = qs.stringify(config.data);
            }
        }
        // 在发送请求之前做些什么
        return config;
    },
    (error) => {
        // 对请求错误做些什么
        return Promise.reject(error);
    }
);

// 全局拦截相应头
instance.interceptors.response.use(
    (xhr) => {
        if (xhr.status == 200) {
            let { code, msg } = xhr.data;

            if (code !== 200) Message.error(msg);
            return xhr.data;
        } else {
            Message.error(xhr.statusText);
        }
    },
    (err) => {
        Message.error(err.message);
        return Promise.reject(err);
    }
);

Vue.prototype.$ajax = instance;
Vue.prototype.$get = instance.get;
Vue.prototype.$post = instance.post;
